// Remote Demo Example
//
// 注意：这是一个概念性示例，演示如何使用ProtoActor-RS的远程通信功能。
// 由于远程通信模块的实现还在进行中，这个示例无法直接运行。
// 它主要用于展示API的用法和设计模式。

use std::any::Any;
use std::time::Duration;
use async_trait::async_trait;
use tokio::time::sleep;
use uuid::Uuid;

/// 示例消息
#[derive(Debug, Clone)]
struct HelloRequest {
    name: String,
    request_id: String,
}

/// 示例响应
#[derive(Debug, Clone)]
struct HelloResponse {
    message: String,
    request_id: String,
}

/// 示例Actor
struct GreeterActor {
    name: String,
}

// 假设Actor trait已存在
#[async_trait]
trait Actor {
    async fn receive(&self, msg: Box<dyn Any + Send>) -> Result<(), String>;
    async fn started(&self) -> Result<(), String>;
    async fn stopping(&self) -> Result<(), String>;
}

#[async_trait]
impl Actor for GreeterActor {
    async fn receive(&self, msg: Box<dyn Any + Send>) -> Result<(), String> {
        // 处理HelloRequest消息
        if let Some(hello) = msg.downcast_ref::<HelloRequest>() {
            println!("[{}] 收到问候请求: {}，请求ID: {}", 
                self.name, hello.name, hello.request_id);
            
            // 构建响应
            let response = HelloResponse {
                message: format!("你好, {}! 来自 {}", hello.name, self.name),
                request_id: hello.request_id.clone(),
            };
            
            // 在实际场景中，这里会通过ctx.respond发送响应
            println!("[{}] 发送响应: {:?}", self.name, response);
            
            return Ok(());
        }
        
        println!("[{}] 收到未知消息类型", self.name);
        Ok(())
    }
    
    async fn started(&self) -> Result<(), String> {
        println!("[{}] GreeterActor已启动", self.name);
        Ok(())
    }
    
    async fn stopping(&self) -> Result<(), String> {
        println!("[{}] GreeterActor正在停止", self.name);
        Ok(())
    }
}

/// 远程Actor系统使用示例（概念性代码）
async fn remote_system_example() {
    println!("远程通信示例开始");
    
    // 实际中会使用这样的API创建远程Actor系统
    // let mut server_system = RemoteActorSystem::new("127.0.0.1:8080").unwrap();
    // let mut client_system = RemoteActorSystem::new("127.0.0.1:8081").unwrap();
    
    println!("1. 服务端注册Actor类型");
    // server_system.register::<GreeterActor>("Greeter", props).unwrap();
    
    println!("2. 服务端创建Greeter实例");
    // let greeter_pid = server_system.spawn_remote::<GreeterActor>(
    //     "", "Greeter", "greeter1", Duration::from_secs(5)).await.unwrap();
    
    println!("3. 服务端启动远程系统");
    // server_system.start().await.unwrap();
    
    println!("4. 客户端启动远程系统");
    // client_system.start().await.unwrap();
    
    println!("5. 客户端获取远程Greeter引用");
    // let remote_greeter = PID::new("127.0.0.1:8080", "greeter1");
    
    println!("6. 客户端发送请求到远程Greeter");
    // let request = HelloRequest {
    //     name: "客户端".to_string(),
    //     request_id: Uuid::new_v4().to_string(),
    // };
    
    // match client_system.request::<HelloResponse>(
    //     &remote_greeter, request, Duration::from_secs(5)).await {
    //     Ok(response) => println!("收到响应: {:?}", response),
    //     Err(e) => println!("请求失败: {}", e),
    // }
    
    println!("7. 客户端和服务端停止远程系统");
    // client_system.stop().await.unwrap();
    // server_system.stop().await.unwrap();
    
    println!("远程通信示例结束");
}

/// 主函数
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("ProtoActor-RS 远程通信演示");
    println!("");
    println!("注意：这是一个概念性示例，演示远程Actor通信的使用方式。");
    println!("实际代码需要等待远程通信模块实现完成后才能运行。");
    println!("");
    
    remote_system_example().await;
    
    println!("");
    println!("远程通信模块的主要组件：");
    println!("- RemoteActorSystem: 扩展本地Actor系统，提供远程通信功能");
    println!("- 序列化系统: 用于消息的序列化和反序列化");
    println!("- 远程PID引用: 表示本地或远程Actor的标识符");
    println!("- 端点管理: 维护与远程节点的连接");
    
    Ok(())
} 